在Day7的時候已經談過移動平均線的定義,在這邊則是說明移動平均線的上揚與下彎所代表的涵義:
前面談到移動平均線的上揚與下彎,最主要帶出今天的的重點:扣抵。扣抵的定義為扣除和相抵(遞補);其實質功能為可以預知移動平均線會上揚或是下彎,藉此能做到提前布局,或是提早減碼的策略。
用以下模擬資料與5日移動平均線,進行扣抵試算:
扣小加大:假如扣除(扣)的是低價,新增(抵)的是高價,會造成平均數字增加,因此移動平均線會上揚。以下案例為「扣」93「加」94,移動平均線上揚(94.6 → 94.8):
扣平:假如扣除(扣)與新增(抵)是相同的價格,會造成平均數字不變,因此移動平均線會走平。以下案例為「扣」94「加」94,移動平均線走平:
扣大加小:假如扣除(扣)的是高價,新增(抵)的是低價,會造成平均數字降低,因此移動平均線會下彎。 以下案例為「扣」95「加」94,移動平均線下彎(94.8 → 94.6):
必須假設未來一段時間股價波動不大,股票暴漲暴跌則扣抵理論無效。另外盤整區間扣抵是無效的。扣抵比較適用20日移動平均線以上的天期,比較具備意義。
以下為驗證資料的設定:
試算扣抵程式碼如下所示:
# 設定資料區間:區間的最後一天當作為「當前」的日期
df_k_line_range = df_k_line['2023-04-21':'2023-06-09']
# 「當前」的日期的股價之價位
current_price = df_k_line_range.iloc[-1]['Close']
# 設定20日移動平均線扣抵開始日期並取得其索引
deduction_date_idx = date_to_index(df_k_line_range,df_k_line_range.iloc[-20].name.strftime("%Y-%m-%d"))
# 取得總筆數
row, _ = df_k_line_range.shape
# 扣抵判斷
predict_days = 0
for idx in range(deduction_date_idx+1,row) :
deduction_price = df_k_line_range.iloc[idx]['Close']
if deduction_price < current_price :
print('扣小加大 : {} 扣小({:.2f}) , 加大({:.2f})'.format(df_k_line_range.iloc[idx].name.strftime("%Y-%m-%d"),deduction_price,current_price))
elif df_k_line_range.iloc[idx]['Close'] > current_price :
print('扣大加小 : {} 扣大({:.2f}) , 加小({:.2f})'.format(df_k_line_range.iloc[idx].name.strftime("%Y-%m-%d"),deduction_price,current_price))
# 以此案例,當出現「扣大加小」時跳出
predict_days = predict_days + 1
break
predict_days = predict_days + 1
print('預計第{}天後移動平均線下彎'.format(predict_days))
程式執行後顯示『預計第4天後移動平均線下彎』。接下來用以下程式碼驗證移動平均線實際下彎的時間:
# 設定資料區間
df_sma_range = df_sma['2023-06-09':]
# 從「當前」的日期往後確認20日移動平均線的趨勢
relay_days = 0
for idx in range(1,len(df_sma_range)) :
if df_sma_range.iloc[idx]['SMA20'] > df_sma_range.iloc[idx-1]['SMA20'] :
print('{} : 移動平均線上揚'.format(df_sma_range.iloc[idx].name.strftime("%Y-%m-%d")))
elif df_sma_range.iloc[idx]['SMA20'] < df_sma_range.iloc[idx-1]['SMA20'] :
print('{} : 移動平均線下彎'.format(df_sma_range.iloc[idx].name.strftime("%Y-%m-%d")))
# 以此案例,當出現「移動平均線下彎」時跳出
relay_days = relay_days + 1
break
else :
print('{} : 移動平均線走平'.format(df_sma_range.iloc[idx].name.strftime("%Y-%m-%d")))
relay_days = relay_days + 1
print('實際第{}天後移動平均線下彎'.format(relay_days))
程式執行後顯示『實際第5天後移動平均線下彎』。預測與實際相差僅有一天,由此可確認扣抵確有預知移動平均線會上揚或是下彎的功能。
完整的程式碼請參照「第二十天:移動平均線的扣抵.ipynb」。